package com.springday.springmvc.web.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;

import com.springday.springmvc.domain.Producto;
import com.springday.springmvc.service.ProductoService;
import com.springday.springmvc.service.impl.ProductoValidador;

@Controller
@RequestMapping("/producto/**")
public class ProductoController extends BaseFormController {
	
	private static final String VISTA_REDIRECT_PRODUCTO = "redirect:producto.html";
	private static final String VISTA_REDIRECT_LISTAPRODUCTO = "redirect:listaproducto.html";
	private static final String VISTA_PRODUCTO = "/producto/producto";
	private static final String PRODUCTO = "producto";
	private static final String PRODUCTOS = "productos";

	@Autowired
	private ProductoService productoService;
	
	@Autowired
	private ProductoValidador productoValidador;
	
    @RequestMapping(value = "/listaproducto.html")
    public @ModelAttribute(PRODUCTOS) List<Producto> listarProductos() {
    	
    	return productoService.obtenerListaProductos(new Producto());
    }	
    
    @RequestMapping(value = "/producto.html", method = RequestMethod.GET)
    public @ModelAttribute(PRODUCTO) Producto crearProducto(
    			@RequestParam(value = "id", required = false) Integer id) {
    	
    	Producto producto = new Producto();
		if (id != null) {			
			
			producto = productoService.obtenerProducto(id);					
			return producto;
		}
		
		producto.setEstado(Boolean.TRUE);
        return producto;
    }        
    
	@RequestMapping(value = "/producto.html", method = RequestMethod.POST)
	public String guardarProducto(@ModelAttribute(PRODUCTO) Producto producto,
			BindingResult result, SessionStatus status, HttpServletRequest request, 
			ModelMap modelMap) {
		
		try{
			
			productoValidador.validate(producto, result);	
			if (result.hasErrors() ) {		
				modelMap.addAttribute(PRODUCTO, producto);				
				return VISTA_PRODUCTO;
			}
			
			productoService.guardarProducto(producto);
			status.setComplete();
			saveMessage(request, getText("producto.agregado", producto.getNombre(), request.getLocale()));
			return VISTA_REDIRECT_LISTAPRODUCTO;
			
		}catch (Exception e) {
			
			saveError(request, getText("errors.general", request.getLocale()));
			modelMap.addAttribute(PRODUCTO, producto);		
			return VISTA_PRODUCTO;
		}		
	}    
	
	@RequestMapping(value = "/borrarproducto.html")
	public String borrarProducto(@RequestParam(value = "id", required = false) Integer id, 
			HttpServletRequest request) {
		
		try {			
				
			productoService.eliminarProducto(id);
			saveMessage(request, getText("producto.eliminado", request.getLocale()));
			return VISTA_REDIRECT_LISTAPRODUCTO;
			
		} catch (Exception e) {
			
			saveError(request, getText("errors.general", request.getLocale()));
			return VISTA_REDIRECT_PRODUCTO + "?from=list&id="+id;
		}
	}
}
